#ifndef NSI_SINGLETON_H
#define NSI_SINGLETON_H

namespace nsi {

// Generic singleton class
template <typename T>
class singleton
  : private T
{
private:

  // Constructor
  singleton()
  {
    // no-op
  }

  // Destructor
  ~singleton()
  {
    // no-op
  }

  // No copy constructor
  singleton(const singleton&);
  // No assignment operator
  singleton& operator=(const singleton&);

public:
  
  static T& instance()
  {
    // Function-local static to force static initialization
    static singleton<T> instance_;
    return instance_;
  }

};

} // namespace nsi

#endif // !NSI_SINGLETON_H

